package com.itheima.reggie.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.itheima.reggie.common.CustomException;
import com.itheima.reggie.dto.resp.R;
import com.itheima.reggie.pojo.AddressBook;
import com.itheima.reggie.pojo.Dish;
import com.itheima.reggie.service.AddressBookService;
import com.itheima.reggie.util.BaseContext;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.xml.ws.soap.Addressing;
import java.util.List;

import static net.sf.jsqlparser.parser.feature.Feature.set;

@RestController
@Slf4j
@RequestMapping("/addressBook")
public class AddressBookController {

    @Autowired
    private AddressBookService addressBookService;

    /**
     * 增加地址
     * 请求url地址：/addressBook
     * 请求方式：POST
     * 请求参数：JSON格式数据，使用AddressBook 接收
     * 响应结果【格式统一】：R 对象
     *
     * @param addressBook
     * @return
     */
    @PostMapping
    public R save(@RequestBody AddressBook addressBook) {
        log.info("当前用户的地址信息:{}", addressBook);
        //用threadLocal获取当前登录用户的id
        Long id = BaseContext.getCurrentId();
        System.out.println(123);
        //将id赋值给addressBook的user_id
        addressBook.setUserId(id);
        boolean save = addressBookService.update(null);
        return R.success(addressBook);
    }


    /**
     * 设置默认地址
     * 请求url地址：/addressBook/default
     * 请求方式：PUT
     * 请求参数：JSON格式数据，使用AddressBook 接收
     * 响应结果【格式统一】：R 对象
     *
     * @param addressBook
     * @return
     */
    @PutMapping("/default")
    public R defaultAddress(@RequestBody AddressBook addressBook) {
        log.info("当前用户的地址:{}", addressBook);
        //获取当前登录用户的id
        Long id = BaseContext.getCurrentId();
        //条件构造器
        LambdaUpdateWrapper<AddressBook> wrapper = new LambdaUpdateWrapper<>();
        //添加条件
        //update address_book set is_default=0 where user_id = ?
        wrapper.eq(AddressBook::getUserId, id)
                .set(AddressBook::getIsDefault, 0);
        addressBookService.update(wrapper);
        //将地址设置为默认地址是否默认 0 否 1是
        addressBook.setIsDefault(1);
        addressBookService.updateById(addressBook);
        return R.success(addressBook);
    }

    /**
     * 根据ID查询地址
     * 请求url地址：/addressBook/1417414526093082626
     * 请求方式：GET
     * 请求参数：无
     * 响应结果【格式统一】：R 对象
     *
     * @param id
     * @return
     */
    @GetMapping("/{id}")
    public R getById(@PathVariable Long id) {
        //根据id查询到当前的对象
        AddressBook addressBook = addressBookService.getById(id);
        //对对象进行判空
        if (addressBook != null) {//不为空,证明查询到了
            return R.success(addressBook);
        }
        return R.error("没有查询到对应的用户地址");
    }

    /**
     * 查询默认地址
     * 请求url地址：/addressBook/default
     * 请求方式：GET
     * 请求参数：无
     * 响应结果【格式统一】：R<AddressBook> 对象
     *
     * @return
     */
    @GetMapping("/default")
    public R<AddressBook> getDefaultAddress() {
        //条件构造器
        LambdaQueryWrapper<AddressBook> wrapper = new LambdaQueryWrapper<>();
        //添加条件 id和is_default=1  where user_id=? and is_default=1
        wrapper.eq(AddressBook::getIsDefault, 1)
                .eq(AddressBook::getUserId, BaseContext.getCurrentId());
        //根据条件进行查询对象
        AddressBook addressBook = addressBookService.getOne(wrapper);
        //对对象进行判空
        if (addressBook != null) { //证明有对象
            //将对象返回给前端
            return R.success(addressBook);
        } else {
            throw new CustomException("没有查询到信息");
        }
    }


    /**
     * 查询指定用户的全部地址
     * 请求url地址：/addressBook/list
     * 请求方式：GET
     * 请求参数：无
     * 响应结果【格式统一】：R 对象
     *
     * @return
     */
    @GetMapping("/list")
    public R getAll() {
        LambdaQueryWrapper<AddressBook> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(AddressBook::getUserId, BaseContext.getCurrentId())
                .orderByDesc(AddressBook::getUpdateTime);
        //根据条件查询当前对象
        List<AddressBook> list = addressBookService.list(wrapper);
        return R.success(list);
    }

    /**
     * 删除地址
     * 请求url地址：/addressBook?ids=1417414526093082626,141741452609308230
     * 请求方式：DELETE
     * 请求参数：?ids=1417414526093082626,141741452609308230
     * 响应结果【格式统一】：R 对象
     *
     * @param ids
     * @return
     */
    @DeleteMapping
    public R delete(@RequestParam List<Long> ids) {
        addressBookService.removeByIds(ids);
        return R.success("删除成功");
    }


    /**
     * 修改地址
     * 请求url地址：/addressBook
     * 请求方式：PUT
     * 请求参数：JSON格式 使用 AddressBook 对象封装
     *
     * @param addressBook
     * @return
     */
    @PutMapping
    public R update(@RequestBody AddressBook addressBook) {
        addressBookService.updateById(addressBook);
        return R.success("修改成功");
    }
}